home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / emulation / aaf / aaf.c < prev    next >
C/C++ Source or Header  |  1999-04-28  |  5KB  |  226 lines

  1.  
  2. /*
  3.  *******************************************************************************
  4.  *
  5.  * upaaf.c
  6.  *
  7.  * Unpack an archive in apple format.
  8.  *
  9.  * Another quality product handcrafted with loving care by:
  10.  *    Jonathan A. Chandross
  11.  *    jac@paul.rutgers.edu
  12.  *    November 1990
  13.  *
  14.  * COPYRIGHT 1990 by Jonathan A. Chandross
  15.  * All rights reserved.
  16.  *
  17.  * Use "cc -D SHELL" to compile for use with a shell.
  18.  *
  19.  *******************************************************************************
  20.  */
  21.  
  22. #include <stdio.h>
  23.  
  24. /*
  25.  *******************************************************************************
  26.  *
  27.  * Defines
  28.  *
  29.  * EXPORT        function is visible outside this module
  30.  * IMPORT        function is defined outside this module
  31.  * STATIC        function is invisible outside this module
  32.  *
  33.  * LENGTH        length of strings
  34.  *
  35.  *******************************************************************************
  36.  */
  37. #define EXPORT
  38. #define IMPORT    extern
  39. #define LOCAL    static
  40.  
  41. #define SHELL
  42. #define LENGTH    255
  43.  
  44. /*
  45.  *******************************************************************************
  46.  *
  47.  * main
  48.  *
  49.  * Unpacks a file in Apple Archive Format
  50.  * 
  51.  * Parameters:
  52.  *    argc            number of command line arguments if compiled
  53.  *                for a shell
  54.  *    argv            command line argument vector
  55.  * Locals:
  56.  *    archive_name        name of archive to unpack if not using a
  57.  *                shell
  58.  * Returns:
  59.  *
  60.  * If this program is compiled for use with a shell, the first command line
  61.  * argument is considered to contain the name of the archive to unpack.  If
  62.  * this program is compiled stand-alone, i.e. not for use with a shell, it
  63.  * prompts for the archive to unpack.
  64.  *
  65.  * The SHELL define is an unsightly way to do things, but there is little
  66.  * choice if this program is to be used on an Apple lacking some sort of
  67.  * shell.
  68.  *
  69.  *******************************************************************************
  70.  */
  71. #ifdef SHELL
  72. EXPORT int main(argc, argv)
  73. int        argc;
  74. char        *argv[];
  75. #else
  76. EXPORT int main()
  77. #endif
  78. {
  79. IMPORT    void    unpack();
  80. #ifdef SHELL
  81. IMPORT    void    usage();
  82. #else
  83. char        archive_name[LENGTH];
  84. #endif
  85.  
  86. #ifdef SHELL
  87.     /*
  88.      * If we are using a shell, then argv[1] will be the name of the
  89.      * archive to unpack.
  90.      */
  91.     if(argc == 2)
  92.         unpack(argv[1]);
  93.     else {
  94.         usage(argv[0]);
  95.         exit(1);
  96.         }
  97. #else
  98.     (void) fputs("Enter name of archive to unpack:", stdout);
  99.     (void) scanf("%s", archive_name);
  100.     unpack(archive_name);
  101. #endif
  102.  
  103.     return(0);
  104. }
  105.  
  106. /*
  107.  *******************************************************************************
  108.  *
  109.  * usage
  110.  *
  111.  * Print out a message on how to use this program
  112.  * 
  113.  * Parameters:
  114.  *    object_name        name of object file storing this program
  115.  * Locals:
  116.  * Returns:
  117.  *
  118.  *******************************************************************************
  119.  */
  120. #ifdef SHELL
  121. LOCAL void usage(object_name)
  122. char        *object_name;
  123. {
  124.     (void) fprintf(stderr, "Usage: %s archive-name\n", object_name);
  125. }
  126. #endif
  127.  
  128. /*
  129.  *******************************************************************************
  130.  *
  131.  * unpack
  132.  *
  133.  * Unpack an archive
  134.  * 
  135.  * Parameters:
  136.  *    archive_file_name    name of archive file to unpack
  137.  * Locals:
  138.  *    buffer            holds each line as it is read out of archive
  139.  *    archive_file        archive file
  140.  *    output_file        current file being unpacked from archive
  141.  * Returns:
  142.  *
  143.  *******************************************************************************
  144.  */
  145. LOCAL void unpack(archive_file_name)
  146. char        *archive_file_name;
  147. {
  148. IMPORT    char    *fgets();
  149. IMPORT    int    fput();
  150. IMPORT    int    strlen();
  151. IMPORT    int    fclose();
  152. IMPORT    FILE    *fopen();
  153. char        buffer[LENGTH];
  154. FILE        *archive_file;
  155. FILE        *output_file = (FILE *)NULL;
  156.  
  157.     /*
  158.      * Open the archive file and make sure it exists.
  159.      */
  160.     if((archive_file = fopen(archive_file_name, "r")) == (FILE *)NULL) {
  161.         (void) fprintf(stderr, "Error: could not open archive '%s'\n",
  162.             archive_file_name);
  163.         exit(1);
  164.         }
  165.     
  166.     /*
  167.      * As long as the file is not empty, process lines
  168.      */
  169.     while(fgets(buffer, LENGTH, archive_file) != (char *)NULL) {
  170.         /*
  171.          * What kind of line do we have? 
  172.          */
  173.         switch(buffer[0]) {
  174.              case '=':
  175.             /*
  176.              * Have a file name.  Remove the trailing newline
  177.              * from the file-name (left by fgets) by overwriting
  178.              * with a Null.  Then open the file and verify that
  179.              * we can write to it.  Skip over the first character
  180.              * in the file-name (it is an '=') 
  181.              */
  182.             buffer[strlen(buffer) - 1] = '\0';
  183.             (void) fprintf(stdout, "Unpacking '%s'\n", &buffer[1]);
  184.  
  185.             /*
  186.              * If we have an open output file, close it.
  187.              */
  188.             if(output_file != (FILE *)NULL)
  189.                 (void) fclose(output_file);
  190.  
  191.             if((output_file = fopen(&buffer[1], "w")) ==
  192.                (FILE *)EOF) {
  193.                 (void) fprintf(stderr,
  194.                     "Error: could not open '%s'\n", buffer);
  195.                 exit(1);
  196.                 }
  197.             break;
  198.              case '-':
  199.             /*
  200.              * Have a line of source.  Add the line to the output
  201.              * file without the leading "-".
  202.              */
  203.             if(output_file == (FILE *)NULL) {
  204.                 fputs("Error: no file specified.\n", stderr);
  205.                 exit(1);
  206.                 }
  207.             else
  208.                 (void) fputs(&buffer[1], output_file);
  209.             break;
  210.              case '+':
  211.             /*
  212.              * End of archive.  Exit.
  213.              */
  214.             exit(0);
  215.             break;
  216.              default:
  217.             /*
  218.              * Have some other type of line (mail header,
  219.              * signature, comment, etc.)  Output it.
  220.              */
  221.             (void) fputs(&buffer[0], stdout);
  222.             break;
  223.              }
  224.         }
  225. }
  226.